package com.bdqn.design.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * IntermediaryInvocationHandler
 *
 * @author LILIBO
 * @since 2023-10-10
 */
public class IntermediaryInvocationHandler implements InvocationHandler {

    /**
     * 被代理的目标对象
     */
    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    /**
     * 为被代理的接口方法定义的代理业务规则
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 执行真实方法之前
        before(proxy, method, args);
        // 通过反射执行目标对象的实际业务
        Object feedback = method.invoke(target, args);
        // 执行真实方法之后
        after(feedback);
        return feedback;
    }

    /**
     * 执行真实方法之前
     */
    private void before(Object proxy, Method method, Object[] args) {
        System.out.println("提供看房前服务（参数验证...）");
    }

    /**
     * 执行真实方法之后
     */
    private void after(Object feedback) {
        System.out.println("提供看房后服务（日志记录...）");
    }

}
